package com.jt.service;

import java.util.*;

import com.jt.mapper.ItemDescMapper;
import com.jt.pojo.ItemDesc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.ItemMapper;
import com.jt.pojo.Item;
import com.jt.vo.EasyUITable;
import org.springframework.transaction.annotation.Transactional;


@Service
public class ItemServiceImpl implements ItemService {
	@Autowired
	private ItemMapper itemMapper;

	@Autowired
	private ItemDescMapper itemDescMapper;


	/**
	 * 执行步骤:1.手动编辑sql    2.利用MP机制 动态生成
	 * SELECT * FROM tb_item LIMIT 起始位置,查询记录数
	 /*第一页 java中数组运算 一般都是含头不含尾
	 SELECT * FROM tb_item LIMIT 0,20;
	 /*第二页
	 SELECT * FROM tb_item LIMIT 20,20;
	 /*第三页
	 SELECT * FROM tb_item LIMIT 40,20;
	 *第N页
	 SELECT * FROM tb_item LIMIT (n-1)ROWS,ROWS;
	 */
	//注意：java中数组运算 一般都是含头不含尾
//自己手动写sql语句进行分页查询
//	@Override
//	public EasyUITable findItemByPage(Integer page, Integer rows) {
//		long total = itemMapper.selectCount(null);
//		int startIndex = (page-1)*rows;
//		List<Item> itemList = itemMapper.findItemByPage(startIndex,rows);
//		return new EasyUITable(total, itemList);
//	}

	//用MP方式进行分页查询
	@Override
	public EasyUITable findItemByPage(Integer page, Integer rows) {
		//1.构建查询参数
		QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
		queryWrapper.orderByDesc("updated");
		//2.将当前页和查询记录数传给MP
		IPage<Item> iPage = new Page<>(page,rows);
		//3.根据分页模型执行分页操作,并将结果返回给分页对象
		iPage = itemMapper.selectPage(iPage, queryWrapper);
		//获取总记录数，和记录
		long total = iPage.getTotal();//由分页工具动态获取
		List<Item> itemList = iPage.getRecords();//获取当前分页的信息
		return new EasyUITable(total, itemList);
	}

	//实现商品入库
	//刚新增的商品是出于上架状态的，所以给Status赋值1
	@Transactional	//事务控制
	@Override
	public void saveItem(Item item, ItemDesc itemDesc) {
		item.setStatus(1).setCreated(new Date()).setUpdated(item.getCreated());
		itemMapper.insert(item);
		//item表的主键是自增，数据库入库之后才会有ID生成
		//所以item.getId()获取不到ID，只是item被写入数据库后，MP帮我们做了ID的回显，所以我们使用item.getId()又能获取到ID了
		itemDesc.setItemId(item.getId()).setUpdated(item.getCreated()).setCreated(new Date());
		itemDescMapper.insert(itemDesc);
	}

	//更新商品信息
	@Transactional
	@Override
	public void updateItem(Item item,ItemDesc itemDesc) {
		//先更新tb_item(商品信息)表中的数据
		item.setUpdated(new Date());
		itemMapper.updateById(item);
		//再更新tb_item_desc(商品描述)表中的数据
		itemDesc.setItemId(item.getId()).setUpdated(new Date());
		itemDescMapper.updateById(itemDesc);
	}

	//手动写sql批量删除
	@Override
	public void deleteItems(Long[] ids) {
		//删除tb_item(商品信息)表中的数据
		itemMapper.deleteItems(ids);
		//再删除tb_item_desc(商品描述)表中的数据
		itemDescMapper.deleteBatchIds(Arrays.asList(ids));
	}

	//商品上架与下架
	@Override
	public void updateStatus(Long[] ids, Integer status) {
		//手动编写sql语句进行上架下架操作
		itemMapper.updateStatus(ids,status);
	}

	//编辑商品信息时，根据其ID查询到其商品描述信息回显到前端页面上
	@Override
	public ItemDesc findItemDescById(Long itemId) {

		return itemDescMapper.selectById(itemId);
	}


}
